WorkspaceThumbnail.prototype = {
_init : function(metaWorkspace) {
this.metaWorkspace = metaWorkspace;
+ this.monitorIndex = global.get_primary_monitor_index();
this.actor = new St.Group({ reactive: true,
clip_to_allocation: true,
Lang.bind(this, this._windowAdded));
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
Lang.bind(this, this._windowRemoved));
+ this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
+ Lang.bind(this, this._windowEnteredMonitor));
+ this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
+ Lang.bind(this, this._windowLeftMonitor));
this.state = ThumbnailState.NORMAL;
this._slidePosition = 0; // Fully slid in
},
setPorthole: function(x, y, width, height) {
+ this._portholeX = x;
+ this._portholeY = y;
this.actor.set_size(width, height);
this._contents.set_position(-x, -y);
},
return this._collapseFraction;
},
- _windowRemoved : function(metaWorkspace, metaWin) {
+ _doRemoveWindow : function(metaWin) {
let win = metaWin.get_compositor_private();
// find the position of the window in our list
if (index == -1)
return;
+ // Check if window still should be here
+ if (win && this._isMyWindow(win))
+ return;
+
let clone = this._windows[index];
this._windows.splice(index, 1);
clone.destroy();
},
- _windowAdded : function(metaWorkspace, metaWin) {
+ _doAddWindow : function(metaWin) {
if (this.leavingOverview)
return;
Mainloop.idle_add(Lang.bind(this,
function () {
if (this.actor && metaWin.get_compositor_private())
- this._windowAdded(metaWorkspace, metaWin);
+ this._doAddWindow(metaWin);
return false;
}));
return;
}
- if (!this._isOverviewWindow(win))
+ // We might have the window in our list already if it was on all workspaces and
+ // now was moved to this workspace
+ if (this._lookupIndex (metaWin) != -1)
+ return;
+
+ if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
return;
let clone = this._addWindowClone(win);
},
+ _windowAdded : function(metaWorkspace, metaWin) {
+ this._doAddWindow(metaWin);
+ },
+
+ _windowRemoved : function(metaWorkspace, metaWin) {
+ this._doRemoveWindow(metaWin);
+ },
+
+ _windowEnteredMonitor : function(metaScreen, monitorIndex, metaWin) {
+ if (monitorIndex == this.monitorIndex) {
+ this._doAddWindow(metaWin);
+ }
+ },
+
+ _windowLeftMonitor : function(metaScreen, monitorIndex, metaWin) {
+ if (monitorIndex == this.monitorIndex) {
+ this._doRemoveWindow(metaWin);
+ }
+ },
+
destroy : function() {
this.actor.destroy();
},
_onDestroy: function(actor) {
this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId);
+ global.screen.disconnect(this._windowEnteredMonitorId);
+ global.screen.disconnect(this._windowLeftMonitorId);
this._windows = [];
this.actor = null;
},
- // Tests if @win belongs to this workspaces
+ // Tests if @win belongs to this workspace and monitor
_isMyWindow : function (win) {
- return win.get_workspace() == this.metaWorkspace.index() ||
- (win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
+ return Main.isWindowActorDisplayedOnWorkspace(win, this.metaWorkspace.index()) &&
+ (!win.get_meta_window() || win.get_meta_window().get_monitor() == this.monitorIndex);
},
// Tests if @win should be shown in the Overview
return false;
let metaWindow = win.get_meta_window();
+
+ // We need to move the window before changing the workspace, because
+ // the move itself could cause a workspace change if the window enters
+ // the primary monitor
+ if (metaWindow.get_monitor() != this.monitorIndex)
+ metaWindow.move_frame(true, this._portholeX, this._portholeY);
+
metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
false, // don't create workspace
time);